-- 恢复秒杀活动库存脚本
-- 根据订单号自动获取信息并恢复所有相关数据
-- ARGV: 1. 活动ID 2. 订单号
-- 
-- 返回值说明:
-- 0 - 恢复失败（订单不存在或订单信息不完整）
-- 1 - 恢复成功

local activityId = ARGV[1]
local orderNo = ARGV[2]

-- 构造订单键
local orderKey = 'seckill:activity:order:' .. orderNo

-- 检查订单是否存在
if redis.call('EXISTS', orderKey) == 0 then
    return 0 -- 订单不存在
end

-- 获取订单信息
local orderInfo = redis.call('GET', orderKey)

-- 检查订单信息是否存在
if orderInfo == nil then
    return 0 -- 订单信息不存在
end

-- 解析订单信息（假设订单信息是JSON格式）
local orderData = cjson.decode(orderInfo)

-- 获取订单中的必要信息
local userId = orderData.userId
local productId = orderData.productId
local quantity = tonumber(orderData.quantity)

-- 检查是否获取到所有必要信息
if userId == nil or productId == nil or quantity == nil then
    return 0 -- 订单信息不完整
end

-- 构造其他必要的Redis键
local stockKey = 'seckill:activity:stock:' .. activityId .. ':' .. productId
local userBuyKey = 'seckill:activity:purchased:' .. activityId .. ':' .. productId .. ':' .. userId
local orderMappingKey = 'seckill:activity:order:mapping:' .. activityId .. ':' .. userId .. ':' .. productId

-- 恢复库存
if redis.call('EXISTS', stockKey) == 1 then
    redis.call('INCRBY', stockKey, quantity)
end

-- 减少用户购买数量
if redis.call('EXISTS', userBuyKey) == 1 then
    local boughtCount = tonumber(redis.call('GET', userBuyKey) or '0')
    if boughtCount >= quantity then
        redis.call('DECRBY', userBuyKey, quantity)
        -- 如果购买数量为0，删除购买记录
        if redis.call('GET', userBuyKey) == '0' then
            redis.call('DEL', userBuyKey)
        end
    end
end

-- 删除订单记录和映射
redis.call('DEL', orderKey)
if redis.call('EXISTS', orderMappingKey) == 1 then
    redis.call('SREM', orderMappingKey, orderNo)
    -- 如果映射集合为空，删除该集合
    if redis.call('SCARD', orderMappingKey) == 0 then
        redis.call('DEL', orderMappingKey)
    end
end

return 1 -- 恢复成功